package 基础;


import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 1、被代理类： 没有实现接口，需要CGlib动态代理的目标类
 */
class TargetObject {
	public String method1(String paramName) {
		return paramName;
	}

	public int method2(int count) {
		return count;
	}

	public int method3(int count) {
		return count;
	}

	@Override
	public String toString() {
		return "TargetObject []" + getClass();
	}
}

/**
 * 2、拦截器： 目标对象拦截器，实现MethodInterceptor
 */
class TargetInterceptor implements MethodInterceptor {
	/**
	 * 重写方法拦截在方法前和方法后加入业务 Object obj为目标对象 Method method为目标方法 Object[] params 为参数，
	 * MethodProxy proxy CGlib方法代理对象
	 */
	public Object intercept(Object obj, Method method, Object[] params, MethodProxy proxy) throws Throwable {
		System.out.println("调用前");
		Object result = proxy.invokeSuper(obj, params);
		System.out.println(" 调用后" + result);
		return result;
	}
}

//参数：Object为由CGLib动态生成的代理类实例，Method为上文中实体类所调用的被代理的方法引用，Object[]为参数值列表，MethodProxy为生成的代理类对方法的代理引用。
//返回：从代理实例的方法调用返回的值。
//其中，proxy.invokeSuper(obj,arg)：
//调用代理类实例上的proxy方法的父类方法（即实体类TargetObject中对应的方法）
//在这个示例中，只在调用被代理类方法前后各打印了一句话，当然实际编程中可以是其它复杂逻辑。

//3、生成动态代理类：
public class hello {
	public static void main(String args[]) {
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(TargetObject.class);
		enhancer.setCallback(new TargetInterceptor());
		TargetObject targetObject2 = (TargetObject) enhancer.create();
		System.out.println(targetObject2);
		System.out.println(targetObject2.method1("mmm1"));
		System.out.println(targetObject2.method2(100));
		System.out.println(targetObject2.method3(200));
	}
}